[quartz] Convert frame_link, windows_awaiting_frame to GSList.
authorJohn Ralls <jralls@ceridwen.us>
Thu, 23 Mar 2023 18:32:15 +0000 (11:32 -0700)
committerJohn Ralls <jralls@ceridwen.us>
Thu, 23 Mar 2023 18:44:33 +0000 (11:44 -0700)
We were't using GList's prev member; worse, we weren't setting it
and that broke g_list_remove_link so that the link wasn't removed
in _gdk_quartz_display_remove_frame_callback.

Closes #5593

gdk/quartz/gdkdisplay-quartz.c
gdk/quartz/gdkdisplay-quartz.h
gdk/quartz/gdkwindow-quartz.h

index 53726e38b633fae86081e4e22905da3d3e76d883..3ace0170bee17df5bc2953ffd78d44ef876498df 100644 (file)
@@ -96,7 +96,6 @@ _gdk_quartz_display_add_frame_callback (GdkDisplay             *display,
   display_quartz = GDK_QUARTZ_DISPLAY (display);
 
   impl->frame_link.data = window;
-  impl->frame_link.prev = NULL;
   impl->frame_link.next = display_quartz->windows_awaiting_frame;
 
   display_quartz->windows_awaiting_frame = &impl->frame_link;
@@ -110,14 +109,14 @@ _gdk_quartz_display_remove_frame_callback (GdkDisplay             *display,
                                            GdkWindow              *window)
 {
   GdkQuartzDisplay *display_quartz = GDK_QUARTZ_DISPLAY (display);
-  GList *link;
+  GSList *link;
 
-  link = g_list_find (display_quartz->windows_awaiting_frame, window);
+  link = g_slist_find (display_quartz->windows_awaiting_frame, window);
 
   if (link != NULL)
     {
       display_quartz->windows_awaiting_frame =
-        g_list_remove_link (display_quartz->windows_awaiting_frame, link);
+        g_slist_remove_link (display_quartz->windows_awaiting_frame, link);
     }
 
   if (display_quartz->windows_awaiting_frame == NULL)
@@ -129,7 +128,7 @@ gdk_quartz_display_frame_cb (gpointer data)
 {
   GdkDisplayLinkSource *source;
   GdkQuartzDisplay *display_quartz = data;
-  GList *iter;
+  GSList *iter, **last_next = NULL;
   gint64 presentation_time;
   gint64 now;
 
@@ -154,6 +153,12 @@ gdk_quartz_display_frame_cb (gpointer data)
       GdkFrameClock *frame_clock = gdk_window_get_frame_clock (window);
       GdkFrameTimings *timings;
 
+      /* Clear the frame_link */
+      iter->data = NULL;
+      if (last_next && *last_next)
+        *last_next = NULL;
+      last_next = &iter->next;
+
       if (frame_clock == NULL)
         continue;
 
index 59245da7cad8460e4910c9b714d33c1e2796e517..dbe8f67e977185084c493b030f48aed333b5ab99 100644 (file)
@@ -39,7 +39,7 @@ struct _GdkQuartzDisplay
   GPtrArray *monitors;
   /* This structure is not allocated. It points to an embedded
    * GList in the GdkWindow. */
-  GList   *windows_awaiting_frame;
+  GSList   *windows_awaiting_frame;
   GSource *frame_source;
 };
 
index de9a5ebccf2710de77960196ab7d7540b3a7424b..7551e9be67499c8902ba13f808d0f74f45770078 100644 (file)
@@ -66,7 +66,7 @@ struct _GdkWindowImplQuartz
   gint shadow_max;
 
   gboolean use_cg_context;
-  GList frame_link;
+  GSList frame_link;
   gint pending_frame_counter;
 };